#include <iostream>

using namespace std;

#define BUFFER_SIZE 10000000000

/*
1、捕捉异常
*/
void test01()
{
    /*异常的语法
    try
    {
        
    }
    catch(const std::exception& e)
    {
        std::cerr << e.what() << '\n';
    }
    2、如果程序出现异常，出异常以后的代码不会执行
    */
    cout<<"1111"<<endl;
    for (int idx = 0; idx < BUFFER_SIZE; idx++)
    {

        try
        {
            int * num = new int[BUFFER_SIZE];
            cout<<"20---------\n";
        }
        catch(...)/*3、捕捉任意异常*/
        {
            cout<<"内存不够"<<endl;
            break;
        }
        /*4、如果异常不被处理 程序终止*/
    }
    cout<<"2222"<<endl;

}

/*主动抛异常
    语法：
        throw(int)123 : 整形
        throw(string)"123" : 字符串
*/
int myDivide(int val1, int val2)
{
    if (val2 == 0)
    {
        throw "除数数字不能为0";
    }
    return val1 / val2;
}

/*异常声明 
    1、可能会抛出任何异常*/
int func1()
{
    return 0;
}

/*可能会抛出异常*/
int func3() noexcept(false) 
{
    return 0;
}

/*异常声明 
    2、不抛出任何异常*/
int func2() throw()
{
    return 0;
}

#if 0
/*异常声明 
    3、只可能抛出int double类型的异常*/
int func3() throw(int, double)
{
    return 0;
}
#endif
/*异常声明目的： 为了团队开发*/

int func4() noexcept    /*保证不抛出异常*/
{
    return 0;
}
int func4() noexcept(true)    /*保证不抛出异常*/
{
    return 0;
}

int main()
{
    try
    {
        /*主动抛出异常*/
        myDivide(100, 0);
    }
    catch(const char *str)  /*使用所有抛出异常*/
    {
        cout<<"此函数主动抛出异常:"<<str<<endl;
    }
    
    cout<<"hello world"<<endl;

    return 0;
}